#ifndef MARGINCALCULATIONSERVICE_H
#define MARGINCALCULATIONSERVICE_H

#include "processingsettings.h"
#include "dpicalculationservice.h"

/**
 * MarginCalculationService - 统一边距计算服务
 * 
 * Martin Fowler重构：Extract Class
 * 将分散在PageRenderer和UnifiedPageRenderer中的边距计算逻辑提取到统一服务中
 * 
 * 职责：
 * - 统一的内容区域计算
 * - 零边距检测
 * - 边距有效性验证
 * - 边距区域计算
 */
class MarginCalculationService
{
public:
    /**
     * 检查是否为零边距
     * @param margins 边距设置
     * @return 是否为零边距
     */
    static bool isZeroMargin(const ProcessingSettings::MarginSettings& margins) {
        return margins.top <= 0.0 && margins.bottom <= 0.0 && 
               margins.left <= 0.0 && margins.right <= 0.0;
    }
    
    /**
     * 计算平均边距（用于兼容性）
     * @param margins 边距设置
     * @return 平均边距值（毫米）
     */
    static double calculateAverageMargin(const ProcessingSettings::MarginSettings& margins) {
        return (margins.top + margins.bottom + margins.left + margins.right) / 4.0;
    }
    
    /**
     * 验证边距设置的有效性
     * @param margins 边距设置
     * @param pageWidthMM 页面宽度（毫米）
     * @param pageHeightMM 页面高度（毫米）
     * @return 是否有效
     */
    static bool isValidMargin(const ProcessingSettings::MarginSettings& margins, 
                             double pageWidthMM = 210.0, double pageHeightMM = 297.0) {
        // 检查边距是否为负数
        if (margins.top < 0.0 || margins.bottom < 0.0 || 
            margins.left < 0.0 || margins.right < 0.0) {
            return false;
        }
        
        // 检查边距是否超过页面尺寸
        if (margins.left + margins.right >= pageWidthMM ||
            margins.top + margins.bottom >= pageHeightMM) {
            return false;
        }
        
        return true;
    }
    
    /**
     * 计算边距像素值
     * @param marginMM 边距毫米值
     * @param dpi 目标DPI
     * @return 边距像素值
     */
    static int calculateMarginPixels(double marginMM, double dpi) {
        return DPICalculationService::mmToPixels(marginMM, dpi);
    }
    
    /**
     * 计算内容区域尺寸
     * @param pageWidth 页面宽度（像素）
     * @param pageHeight 页面高度（像素）
     * @param margins 边距设置
     * @param dpi 目标DPI
     * @param contentX 输出：内容区域X坐标
     * @param contentY 输出：内容区域Y坐标
     * @param contentWidth 输出：内容区域宽度
     * @param contentHeight 输出：内容区域高度
     */
    static void calculateContentArea(int pageWidth, int pageHeight,
                                   const ProcessingSettings::MarginSettings& margins,
                                   double dpi,
                                   int& contentX, int& contentY,
                                   int& contentWidth, int& contentHeight) {
        if (isZeroMargin(margins)) {
            contentX = 0;
            contentY = 0;
            contentWidth = pageWidth;
            contentHeight = pageHeight;
            return;
        }
        
        int topPx = calculateMarginPixels(margins.top, dpi);
        int bottomPx = calculateMarginPixels(margins.bottom, dpi);
        int leftPx = calculateMarginPixels(margins.left, dpi);
        int rightPx = calculateMarginPixels(margins.right, dpi);
        
        contentX = leftPx;
        contentY = topPx;
        contentWidth = pageWidth - leftPx - rightPx;
        contentHeight = pageHeight - topPx - bottomPx;
    }
};

#endif // MARGINCALCULATIONSERVICE_H